package com.example.forum.dao;

import com.example.forum.model.Message;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface MessageMapper {

    int insertSelective(Message row);

    Message selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(Message row);

    int deleteByPrimaryKey(Long id);

    int insert(Message record);

    int updateByPrimaryKey(Message record);

    /**
     * 根据用户id 查询该用户站内信未读数量
     * @param receiveUserId  用户id
     * @return  数量
     */
    int selectUnreadCount(@Param("receiveUserId") Long receiveUserId);

    /**
     * 根据接收者id 查询所有站内信
     * @param receiveUserId  接收者id
     * @return List<Message>
     */
    List<Message>  selectByReceiveUserId(@Param("receiveUserId") Long receiveUserId);
    
    /**
     * 将用户的所有未读消息标记为已读
     * @param userId 用户ID
     * @return 更新的记录数
     */
    int markAllAsRead(@Param("userId") Long userId);
    
    /**
     * 根据接收者ID和参数查询消息
     * @param receiveUserId 接收者ID
     * @param queryParam 查询参数
     * @param offset 分页偏移量
     * @param limit 分页大小
     * @return 符合条件的消息列表
     */
    List<Message> selectByReceiveUserIdWithParams(
            @Param("receiveUserId") Long receiveUserId, 
            @Param("queryParam") Message queryParam,
            @Param("offset") int offset,
            @Param("limit") int limit);
            
    /**
     * 根据接收者id查询站内信并包含发送者信息
     * @param receiveUserId 接收者id
     * @return 消息列表（包含发送者用户信息）
     */
    List<Message> selectByReceiveUserIdWithUserInfo(@Param("receiveUserId") Long receiveUserId);

    /**
     * 统计用户未读消息数量
     * @param receiveUserId 接收者ID
     * @return 未读消息数量
     */
    int countUnreadByReceiveUserId(Long receiveUserId);
    
    /**
     * 统计总消息数
     * @return 消息总数
     */
    int countTotalMessages();
    
    /**
     * 统计今日新增消息数
     * @return 今日新增消息数
     */
    int countTodayNewMessages();
    
    /**
     * 根据用户ID和消息类型标记为已读
     * @param userId 用户ID
     * @param type 消息类型
     * @return 更新的记录数
     */
    int markReadByType(@Param("userId") Long userId, @Param("type") String type);
    
    /**
     * 统计用户各类型消息数量
     * @param receiveUserId 接收者ID
     */
    int countMessagesByType(@Param("receiveUserId") Long receiveUserId, @Param("type") String type);
    
    /**
     * 根据接收者ID、消息类型和状态统计消息数量
     * @param receiveUserId 接收者ID
     * @param type 消息类型，如private, system, comment, like等，传null则不限类型
     * @param status 消息状态，0未读，1已读，传null则不限状态
     * @return 消息数量
     */
    int countMessagesByTypeAndStatus(
        @Param("receiveUserId") Long receiveUserId, 
        @Param("type") String type, 
        @Param("status") Byte status);
}